12
תגובות
יש לי דף PHP שאני רוצה לזהות כאשר הוא נסגר
אז פתחתי את הדף עם הקוד שכתוב למטה וסגרתי אותו בדיוק מאית שניה אחרי
echo '<?xml version="1.0"?>';flush();ob_flush();$c=0;
do{
sleep(2);
print "\n";flush();ob_flush();
$c++;
sleep(1);
if(connection_status()!=0)die;
$m->query("UPDATE try SET cycle=$c WHERE id=0");}while(true);

אך הבעיה היא שהדף עובר פעמיים את WHILE ורק אז הוא מביין כי הדף נסגר
(במסד הCYCLE מראה על "2")

הקוד שכתבתי מכיל פעמיים OB_FLUSH מכיוון שרק בדרך זו הCYCLE שווה ל2 ולא לשלוש..

המטרה: לזהות ב1 סיבובים כי הדף נסגר

12 תשובות

avatar ענה intval ב 11 ליוני 2013 #

אי אפשר.

avatar ענה itamarhadad ב 11 ליוני 2013 #

מה זאת אומרת אי אפשר

סתם לידע כללי גם אם אני שם

sleep(30);

ויוצא אחרי מאית שניה מהדף זה עדיין עובר 2 סיבובים ..
אפילו ניסיתי לחלק את ה30 ל3 ואז FLUSH וכן הלאה 3 פעמים

אז זה גם לא ענין של זמן אלא בעיה בקוד

avatar ענה intval ב 11 ליוני 2013 #

זה אומר שאתה יכול לעבור לתכנת משהו אחר.

avatar ענה itamarhadad ב 11 ליוני 2013 #

לא משנה יש אולי פתרון אחר במקום ABORT??
יש אפשרות לשלוח משהו מהצד לקוח לדף PHP באמצע הטעינה שלו?
והדף יזהה את זה באותו הרגע, ואז אני יוכל להריץ קוד ובסיום DIE..

avatar ענה intval ב 11 ליוני 2013 #

מה אתה מנסה לעשות ובשביל מה ?

avatar ענה itamarhadad ב 11 ליוני 2013 #

יש לי דף שאמור להיטען כלומר לקבל SLEEP בלולאה עד אשר הוא מוצא הודעות חדשות במסד..
אני רוצה שברגע שהמשתמש יתנתק כלומר יסגור את הדף (ABORT) אז השרת ידע לשלוח הודעה בהתאם..

בנוסף בחיפוש לקוחות לשיחה מתבצע אותו תהליך אשר סיומו תלוי בסגירת דף הלונג
לולאה אחת שעובד יתר על המידה יכולה להשפיע על חיבורי סרק
ובנוסף מאיטה את הניתוק ממשתמש שהתנתק קודם לכן

avatar ענה intval ב 11 ליוני 2013 #

ולמה זה בעיה שהשרת עושה אקסטרה ריצה בלולאה ?
אז הוא יבין שהמשתמש התנתק חצי שניה אחרי.

avatar ענה itamarhadad ב 12 ליוני 2013 #

יש לי קוד שאמור לחפש שותף לשיחה שנפתחה.
כלומר כל לולאה גוררת איתה חיפוש מחדש של שותף לשיחה
במידה והדף יסגר לולאה אחת לפני הלולאה בה יימצא השותף, יקבל השותף הודעה על חיבור עם משתמש שלמעשה הוא חיבור סרק
הבעיה נובעתאך ורק מלולאה נוספת שהתווספה לדף

avatar ענה intval ב 12 ליוני 2013 #

צור משתנה חדש שנקרא האם מחובר.
חוץ מזה, חיפוש משתמשים חדשים אפשר לעשות סתם עם בקשת ajax. זה פעולה שקוראת פעם אחת ולא באמת מצריחה חיבור פתוח

avatar ענה itamarhadad ב 12 ליוני 2013 #

עזוב את הנושא הזה לרגע..

אני רוצה רק להבין למה תמיד נדרש סיבוב נוסף כי אפילו אם שמתי לו SLEEP של 60 שניות עדיין הוא עובר פעמיים על הקוד
זאת אומרת שזה לא עניין של זמן אלא בעיה

ע"פ מה שאתה אומר PHP תמיד מחכה שיהיה לולאה נוספת ואז היא בודקת ABORT, מה מוסיפה הלולאה לבדיקה?
יכול להיות שעצם קריאה לWHILE קוראת מחדש לבדיקה נוספת?
אבל מה ההיגיון שהיא תעשה את זה כי אין פה בעיית זמן אלא הקוד בכוונה מחכה ללולאה השנייה..

avatar ענה intval ב 12 ליוני 2013 #

מתוך הקוד מקור של PHP זה עובד ככה:
PHP מנסה להעביר לאפאצ'י את הפלט. אם אפאצ'י קיבל אותו - הכל בסדר, הקונקשן נחשב פתוח.
עם אפאצ'י לא קיבל אותו (כי אין לו לאן לשלוח אותו הלאה) - הקונקשן נחשב מנותק.
בגלל זה בדוקומנטציה כתוב שבשביל שהפונקציה הזות תעבוד - צריך לנסות לפלוט פלט כלשהו.

עכשיו למה פעמיים?
לא יודע, אבל אם אתה ממש רוצה לדעת - תוכל לעיין בקוד מקור של אפאצ'י.
בתור הנחה - יכול להיות שלאפאצ'י יש קאש פנימי כלשהו שעד שלא יתמלא - אפאצ'י בכלל לא מנסה לשלוח שום דבר ללקוח.
יכול להיות שאם תגדיל את

print "\n";

למשהו כמו
echo str_repeat("\0", 256);

או מספר גדול יותר - אפאצ'י לא ישמור בבופר הפנימי שום דבר.

לא יודע עד כמה ההנחה הזאת נכונה. יכול להיות שסתם לאפאצ'י עצמו לוקח זמן להבין שהקונקשן נסגר
או שהפלט הראשון נשלח בכל מקרה, לא משנה אם יש יעד מאזין ורק הפלט השני לא.

ככה או ככה, כל זה אקטואלי רק לאפאצ'י ( שבו אתה כנראה משתמש).

avatar ענה yonikal56 ב 12 ליוני 2013 #

אפשר להשתמש בjs במקרה הזה יש שם ארוע שנקרא
onunload
גשהדף נסגר